package van.planifolia.service.impl;

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import van.planifolia.dao.DeptDao;
import van.planifolia.pojo.Dept;
import van.planifolia.service.DeptService;

import javax.annotation.Resource;

/**
 * @Description: TODO
 * @Author: Van.Planifolia
 * @CreateTime: 2022-12-07  17:40
 * @Version: 1.0
 */
@Service("deptServiceSp")
public class DeptServiceImplSp implements DeptService {
    @Resource(name = "deptDao")
    private DeptDao deptDao;

    /**
     * 根据主键id查询部门信息
     *
     * @param id 部门的主键id
     * @return 查到的部门信息
     */
    /*
        Cacheable 这个注解信息，完成的功能就和我们之前写的查询Redis缓存一样，实现先执行查询Redis缓存的操作，若命中直接返回，若不命中
        则查询数据库并且返回然后保存。
        其中cacheNames是当前key的前缀，会和key=““ 里面的内容共同组成当前Redis缓存的key值
        unless="#result == null" 则是解决当查询结果为null的时候还保存到Redis产生的报错问题，也就是通过这个设置之后
        当查询到的值为null就不会保存到Redis中
     */
    @Override
    @Cacheable(cacheNames = "redis::dept",key = "#id",unless="#result == null")
    public Dept getDeptById(Integer id) {
        // 返回检索到的信息
        return deptDao.selectById(id);
    }
    /*
        CacheEvict这个注解是和我们之前写的删除缓存操作相对应，会先删除缓存中的内容，然后再返回来执行service方法中的内容
     */
    @Override
    @CacheEvict(cacheNames = "redis::dept",key = "#id")
    public int removeById(Integer id) {
        // 执行数据库删除
        return deptDao.deleteById(id);
    }

    /**
     * 根据传递过来的内容更新部门信息
     *
     * @param dept 传递过来的新部门信息
     * @return 更新的信息
     */
    /*
        CachePut则是修改操作，当方法中的修改执行完毕之后去执行对应的缓存修改操作
     */
    @Override
    @CachePut(cacheNames = "redis::dept",key = "#dept.deptno")
    public Dept modifyDept(Dept dept) {
        // 修改操作
        int i = deptDao.updateById(dept);
        return dept;
    }

    /**
     * 添加一个部门信息
     *
     * @param dept 被添加的信息
     * @return 被添加的信息
     */
    @Override
    public Dept addDept(Dept dept) {
        deptDao.insert(dept);
        return dept;
    }
}
